簡體   English   中英

如何持久化地圖 <String, Embeddable type> 在MySQL中使用休眠

[英]How persist Map<String, Embeddable type> using hibernate in mySQL

我想使用Hibernate(4.3.6 Final)來保留基本類型為鍵,非實體可嵌入復合類型值為value的Map。

我對基本類型作為鍵和值沒有任何問題,我以相同的方式完成了所有事情,而且還可以。 當我將map的值更改為可嵌入的復合類型時,我遇到問題,如下所示。

但我得到錯誤:

引起原因:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:“字段列表”中的未知列“哈希”

您能幫助我做錯或想念的事情嗎?

表准備保存我的地圖

表user_address的圖像

我的地圖保留在實體USER(片段)中

@ElementCollection
@CollectionTable(name="USER_ADDRESS", joinColumns=@JoinColumn(name="USER_ID"))
@MapKeyColumn(name="ADDRESS_TYPE")
@AttributeOverrides({@AttributeOverride(name="addressLine1", column=@Column(name="USER_ADDRESS_LINE_1")),
        @AttributeOverride(name="addressLine2", column=@Column(name="USER_ADDRESS_LINE_2"))})
private Map<String,Address> address = new HashMap<String, Address>();

可嵌入的化合物類型ADDRESS(片段)

@Embeddable
public class Address {

@Column(name="ADDRESS_LINE_1")
private String addressLine1;

@Column(name="ADDRESS_LINE_2")
private String addressLine2;

@Column(name="CITY")
private String city;

@Column(name="STATE")
private String state;

@Column(name="ZIP_CODE")
private String zipCode;

public Address() {
}

主要方法公共類申請{

public static void main(String[] args) {
    Session session = HibernateUtil.getSessionFactory().openSession();

    try {
        Transaction transaction = session.beginTransaction();


        User user = new User();

        Address address = new Address();
        Address address2 = new Address();
        setAddressFields(address);
        setAddressFields2(address2);
        user.getAddress().put("ONE",address);
        user.getAddress().put("TWO",address2);
        setUserFields(user);

        session.save(user);

        transaction.commit();

    } catch (Exception e) {
        e.printStackTrace();
    }finally{
        session.close();
        HibernateUtil.getSessionFactory().close();
    }


}

private static void setUserFields(User user) {
    user.setAge(22);
    user.setBirthDate(new Date());
    user.setCreatedBy("kmb");
    user.setCreatedDate(new Date());
    user.setEmailAddress("kmb385");
    user.setFirstName("Kevin");
    user.setLastName("bowersox");
    user.setLastUpdatedBy("kevin");
    user.setLastUpdatedDate(new Date());
}

private static void setAddressFields(Address address) {
    address.setAddressLine1("Line 1");
    address.setAddressLine2("Line 2");
    address.setCity("New York");
    address.setState("NY");
    address.setZipCode("12345");
}

private static void setAddressFields2(Address address) {
    address.setAddressLine1("Line 3");
    address.setAddressLine2("Line 4");
    address.setCity("Corning");
    address.setState("NY");
    address.setZipCode("12345");
}

}

錯誤全文:

調試-插入USER_ADDRESS(USER_ID,哈希,值,ADDRESS_LINE_1,ADDRESS_LINE_2,CITY,STATE,ZIP_CODE)值(?,?,?,?,?,?,?,?)休眠:插入USER_ADDRESS(USER_ID,哈希,值ADDRESS_LINE_1,ADDRESS_LINE_2,CITY,STATE,ZIP_CODE)值(?,?,?,?,?,?,?,?,?)調試-無法執行語句[n / a] com.mysql.jdbc.exceptions.jdbc4 .MySQLSyntaxErrorException:sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native方法)的sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)處sun.reflect.DelegatingConstructorAccessorImpl.newInstance的``字段列表''中的未知列'hash' .java:45),位於com.mysql.jdbc.Util.handleNewInstance(Util.java:404),位於com.mysql.jdbc.Util.getInstance(java.lang.reflect.Constructor.newInstance(Constructor.java:423) com.mysql.jdbc.SQLError.createSQLException(SQLError.java:939)處的util.java:387)com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3878)處的Util.java:387) 在com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3814)在com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2478)在com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2625) )com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2551)com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1861)com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java: 2073)位於com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java :1994),位於組織org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:62)的org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:208)。 hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1311)在org.hibernate.acti 在org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:463)上的org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:上的on.internal.CollectionRecreateAction.execute(CollectionRecreateAction.java:67) 349),位於org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350),位於org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56),位於org.hibernate.internal.SessionImpl.flush (位於org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:425)的org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)的(SessionImpl.java:1222)。 hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:177)位於com.infiniteskills.data.Application.main(Application.java:33)位於sun.reflect.NativeMethodAccessorImpl.invoke0(本地方法)位於sun。 reflect.NativeMethodAccessorImpl.invoke(NativeMeth odAccessorImpl.java:62)位於sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)位於java.lang.reflect.Method.invoke(Method.java:498)在com.intellij.rt.execution.application.AppMain .main(AppMain.java:144)警告-SQL錯誤:1054,SQLState:42S22錯誤-“字段列表”中的未知列“哈希”信息-HHH000010:在批量發布時,它仍包含JDBC語句DEBUG-HHH000420:關閉-已發布的批處理DEBUG-釋放JDBC連接DEBUG-已釋放的JDBC連接DEBUG-HHH000031:關閉DEBUG-在注銷所有子ServiceRegistries org.hibernate.exception.SQLGrammarException時隱式銷毀ServiceRegistry:無法在org.hibernate.exception上執行語句。 org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)處的internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:80)在org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.j ava:126)位於org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112)位於org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:211) .engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:62)位於org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1311)位於org.hibernate.action.internal.CollectionRecreateAction.execute (CollectionRecreateAction.java:67)在org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:463)在org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:349)在org.hibernate。 org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56)的event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350)org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1222)在org.hibernate.internal.SessionImpl.managedF org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)的lush(SessionImpl.java:425)在org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java: 177)在com.infiniteskills.data.Application.main(Application.java:33)在sun.reflect.NativeMethodAccessorImpl.invoke0(自然方法)在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)在sun.reflect .com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)上的.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)在java.lang.reflect.Method.invoke(Method.java:498)創建人:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native方法)的sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native方法)的字段列中的未知哈希(NativeConstructorAccessorImpl.java:62) ),位於sun.reflect.DelegatingConstructorAccessorImpl.newI nstance(DelegatingConstructorAccessorImpl.java:45)(位於java.lang.reflect.Constructor.newInstance(Constructor.java:423)(位於com.mysql.jdbc.Util.handleNewInstance(Util.java:404))(位於com.mysql.jdbc.Util) com.mysql.jdbc.SQLError.createSQLException(SQLError.java:939)處com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3878)處的.getInstance(Util.java:387)。 com.mysql.jdbc上的MysqlIO.checkErrorPacket(MysqlIO.java:3814)com.mysql.jdbc上的MysqlIO.sendCommand(MysqlIO.java:2478)com.mysql.jdbc上的com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2625) com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1861)處com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2073)處的.ConnectionImpl.execSQL(ConnectionImpl.java:2551) com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5094)處的db.preparedStatement.executeUpdateInternal(PreparedStatement.java:2009)com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatem ent.java:1994),位於org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:208)...還有17個信息-HHH000030:清理連接池[jdbc:mysql:// localhost:3306 / ifinances]調試-取消所有子ServiceRegistries的注冊后,會隱式破壞Bootstrap注冊表

最有趣的IMO錯誤偵聽片段

Hibernate嘗試使用帶有哈希值和值的sql插入,但是當然我的表中沒有這些列。

調試-插入USER_ADDRESS(USER_ID,哈希,值,ADDRESS_LINE_1,ADDRESS_LINE_2,CITY,STATE,ZIP_CODE)值(?,?,?,?,?,?,?,?)休眠:插入USER_ADDRESS(USER_ID,哈希,值,ADDRESS_LINE_1,ADDRESS_LINE_2,CITY,STATE,ZIP_CODE)值(?,?,?,?,?,?,?,?)

預先感謝您的建議

我認為我偏愛找到了解決辦法。

@AttributeOverride存在問題,我不知道為什么,因為我使用了完全相同的符號來保存地址集合(可嵌入復合類型)

我將非常感謝您的幫助,為什么在使用Map的情況下嘗試覆蓋列名時出現問題,而當我嘗試保留相同可嵌入化合物類型(地址)的Collection時一切正常

當我更改類地址以避免覆蓋列名時,我的地圖成功保存了。 換句話說,我已經更改了地址類型的列名,使其與USER_ADDRESS中的列名完全對應。

更改了復合可嵌入類型

現在,列名稱與表中的列名稱完全對應以持久化映射

@Embeddable
public class Address {

    @Column(name="USER_ADDRESS_LINE_1")
    private String addressLine1;

    @Column(name="USER_ADDRESS_LINE_2")
    private String addressLine2;

    @Column(name="CITY")
    private String city;

        @Column(name="STATE")
    private String state;

    @Column(name="ZIP_CODE")
    private String zipCode;

    public Address() {
    }
...

映射以持久化而不覆蓋

@ElementCollection
@CollectionTable(name="USER_ADDRESS", joinColumns=@JoinColumn(name="USER_ID"))
@MapKeyColumn(name="ADDRESS_TYPE")
@Columns(columns = {
        @Column(name="USER_ADDRESS_LINE_1"),
        @Column(name="USER_ADDRESS_LINE_2"),
        @Column(name="CITY"),
        @Column(name="STATE"),
        @Column(name="ZIP_CODE")
})
private Map<String,Address> address = new HashMap<String, Address>();

結果

保存地圖后,從表USER_ADDRESS中選擇

保存地圖后,從表USER_ADDRESS中選擇

休眠:插入USER_ADDRESS(USER_ID,ADDRESS_TYPE,USER_ADDRESS_LINE_1,USER_ADDRESS_LINE_2,CITY,STATE,ZIP_CODE)值(?,?,?,?,?,?,?,?)調試-插入USER_ADDRESS(USER_ID,ADDRESS_TYPE,USER_ADDRESS CITY,STATE,ZIP_CODE)值(?,?,?,?,?,?,?)休眠:插入USER_ADDRESS(USER_ID,ADDRESS_TYPE,USER_ADDRESS_LINE_1,USER_ADDRESS_LINE_2,CITY,STATE,ZIP_CODE)值(?,?,?, ?,?,?,?)DEBUG-完成插入集合:插入2行DEBUG-提交的JDBC連接DEBUG-HHH000420:關閉未發布的批處理DEBUG-釋放JDBC連接DEBUG-已發布的JDBC連接DEBUG-HHH000031:關閉DEBUG-隱式破壞取消所有子ServiceRegistries信息的注冊的ServiceRegistry信息-HHH000030:清理連接池[jdbc:mysql:// localhost:3306 / ifinances]調試-取消所有子ServiceRegistries的注冊隱式破壞Bootstrap注冊表

暫無
暫無

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

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