簡體   English   中英

如何在Hibernate中使用復合主鍵插入

[英]How to insert with composite primary key in Hibernate

使用Hibernate + hsqldb的Java應用程序遇到一些麻煩。 這是我創建的數據庫架構。 我使用hibernate.cfg.xml配置了Hibernate,並使用Intellij Idea的“生成持久性映射”功能為其生成了所有pojo和映射。

這些是生成的文件:

POJO:

User.java

public class User {
    private int id;
    private String name;
    private String lastname;
    private String patronym;
    private Date birthdate;
    private String email;
    private String password;
    private Set<Disk> disks;
    private Set<Takenitem> takenDisks;

   //setters, getters and constructors;
}


磁盤

public class Disk {
    private int id;
    private String name;
    private User host;

    //setters, getters and constructors;
}


Takenitem.java

public class Takenitem {
    private int iddisk;
    private int iduser;
    private User tempUser;
    private Disk disk;

    //setters, getters and constructors;
}


TakenitemPK.java(復合id類)

public class TakenitemPK implements Serializable {
    private int iddisk;
    private int iduser;
    //setters, getters and constructors;
}


對應:

User.hbm.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

    <class name="com.dvdexchange.User" table="USER" schema="PUBLIC" catalog="PUBLIC">
        <id name="id" type="int">
            <column name="ID" />
            <generator class="native" />
        </id>
        <property name="name" column="NAME"/>
        <property name="lastname" column="LASTNAME"/>
        <property name="patronym" column="PATRONYM"/>
        <property name="birthdate" column="BIRTHDATE"/>
        <property name="email" column="EMAIL"/>
        <property name="password" column="PASSWORD"/>
        <set name="disks" inverse="true">
            <key>
                <column name="IDHOST"/>
            </key>
            <one-to-many not-found="ignore" class="com.dvdexchange.Disk"/>
        </set>
        <set name="takenDisks" inverse="true">
            <key>
                <column name="IDUSER"/>
            </key>
            <one-to-many not-found="ignore" class="com.dvdexchange.Takenitem"/>
        </set>
    </class>
</hibernate-mapping>


Disk.hbm.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

    <class name="com.dvdexchange.Disk" table="DISK" schema="PUBLIC" catalog="PUBLIC">
        <id name="id" type="int">
            <column name="ID" />
            <generator class="native" />
        </id>
        <property name="name" column="NAME"/>
        <many-to-one name="host" class="com.dvdexchange.User">
            <column name="IDHOST"/>
        </many-to-one>
    </class>
</hibernate-mapping>


Takenitem.hbm.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

    <class name="com.dvdexchange.Takenitem" table="TAKENITEM" schema="PUBLIC" catalog="PUBLIC">
        <composite-id mapped="true" class="com.dvdexchange.TakenitemPK">
            <key-property name="iddisk" column="IDDISK"/>
            <key-property name="iduser" column="IDUSER"/>
        </composite-id>
        <many-to-one name="tempUser" class="com.dvdexchange.User" insert="false" update="false">
            <column name="IDUSER"/>
        </many-to-one>
        <many-to-one name="disk" class="com.dvdexchange.Disk"/>
    </class>
</hibernate-mapping>


一切正常,但是當我無法在Takenitem中實現插入時。 這是代碼:

Main.java

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        UserDAO userDAO = new UserDAOHibernateImpl();
        DiskDAO diskDAO = new DiskDAOHibernateImpl();
        TakenItemDAO takenItemDAO = new TakenItemDAOHibernateImpl();
        System.out.println("Application started:");

        takenItemDAO.addBorrowing(1, 24);
    }
}


TakenItemDAOHibernateImpl.java(.addBorrowing())

public void addBorrowing(int iduser, int iddisk) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null;
        try{
            tx = session.beginTransaction();
            Criteria crTempUser = session.createCriteria(User.class);
            crTempUser.add(Restrictions.eq("id", iduser));
            User tempUser = (User) crTempUser.uniqueResult();

            Criteria crBorrowedDisk = session.createCriteria(Disk.class);
            crBorrowedDisk.add(Restrictions.eq("id", iddisk));
            Disk borrowedDisk = (Disk) crBorrowedDisk.uniqueResult();

            Takenitem takenitem = new Takenitem(iduser, iddisk, tempUser, borrowedDisk);
            session.save(takenitem);
            tx.commit();
        }catch (HibernateException e) {
            if (tx != null) tx.rollback();
            e.printStackTrace();
        } finally {
            session.close();
        }
    }

當我運行程序時,出現以下異常:

Hibernate: select this_.ID as ID1_2_0_, this_.NAME as NAME2_2_0_, this_.LASTNAME as LASTNAME3_2_0_, this_.PATRONYM as PATRONYM4_2_0_, this_.BIRTHDATE as BIRTHDAT5_2_0_, this_.EMAIL as EMAIL6_2_0_, this_.PASSWORD as PASSWORD7_2_0_ from PUBLIC.USER this_ where this_.ID=?
Hibernate: select this_.ID as ID1_0_0_, this_.NAME as NAME2_0_0_, this_.IDHOST as IDHOST3_0_0_ from PUBLIC.DISK this_ where this_.ID=?
Hibernate: insert into PUBLIC.TAKENITEM (disk, IDDISK, IDUSER) values (?, ?, ?)
мар 01, 2016 6:02:38 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: -5501, SQLState: 42501
мар 01, 2016 6:02:38 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: user lacks privilege or object not found: DISK
мар 01, 2016 6:02:38 PM org.hibernate.internal.SessionImpl$5 mapManagedFlushFailure
ERROR: HHH000346: Error during managed flush [could not prepare statement]
org.hibernate.exception.SQLGrammarException: could not prepare statement
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:63)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:182)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareStatement(StatementPreparerImpl.java:78)
    at org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl.buildBatchStatement(AbstractBatchImpl.java:136)
    at org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl.getBatchStatement(AbstractBatchImpl.java:125)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2902)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3421)
    at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:89)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:560)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:434)
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:337)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1295)
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:468)
    at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3135)
    at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2352)
    at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:485)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:147)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$100(JdbcResourceLocalTransactionCoordinatorImpl.java:38)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:231)
    at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:65)
    at com.dvdexchange.dao.impl.TakenItemDAOHibernateImpl.addBorrowing(TakenItemDAOHibernateImpl.java:31)
    at com.dvdexchange.main.Main.main(Main.java:32)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: DISK
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCPreparedStatement.<init>(Unknown Source)
    at org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$1.doPrepare(StatementPreparerImpl.java:87)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:172)
    ... 26 more


查看SQL日志,並顯示以下ERROR: user lacks privilege or object not found: DISK消息ERROR: user lacks privilege or object not found: DISK

我該如何解決? 為什么II不起作用。 請幫幫我。

提前致謝!

找不到對象錯誤的原因是該列在hsqldb中定義為區分大小寫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM