JPA提供程序对集合表使用错误的数据库类型

时间:2014-05-07 07:31:52

标签: java hibernate jpa orm

我的JPA实体有一个地图,其中key - 另一个实体,值 - 布尔类型。 它被定义为:

@ElementCollection
@CollectionTable(name = "join_table_name",
    joinColumns = {@JoinColumn(name ="owner_entity_key_name") })
@MapKeyColumn(name = "other_entity_key_name")
@Column(name = "name_for_boolean")
private Map<OtherEntity, Boolean> map;

所有者实体(定义了地图)和另一个实体(用作地图中的关键字)都有@Id Integer id;字段。

在集成测试中,jpa提供程序使用以下create table查询:

create table join_table_name (
owner_entity_key_name integer not null, 
name_for_boolean boolean, 
other_entity_key_name binary(255) not null, 
primary key (owner_entity_key_name, name_for_boolean))

正如您所见,other_entity_key_name的类型是binary(255),而不是integer

为什么它以这种方式运作的任何想法?

JPA提供者:

Hibernate Core {4.1.6.Final}

PS: 我已经使用columnDefinition = "integer"明确设置了类型,但问题仍然存在,因为它不是最佳选择,我希望。

PPS:现在,当实体之间的连接被刷新时,我得到一个例外:

  

引起:org.h2.jdbc.JdbcSQLException:数据转换错误   转换   “X'aced00057372003a636f6d2e6272616e646d616b65722e6d6d732e646f6d61696e2e636f6d6d6f6e2e5669727475616c4461746162617365456e746974794265616e00000000000000010200064c000269647400134c6a6176612f6c616e672f496e74656765723b4c00046e616d657400124c6a6176612f6c616e672f537472696e673b4c000d6e65656473417070726f76616c7400134c6a6176612f6c616e672f426f6f6c65616e3b4c00137365744469676974616c57617465726d61726b71007e00034c001273657456697375616c57617465726d61726b71007e00034c00197669727475616c4461746162617365546f564442474c6973747400104c6a6176612f7574696c2f4c6973743b7870737200116a6176612e6c616e672e496e746567657212e2a0a4f781873802000149000576616c7565787200106a6176612e6c616e672e4e756d62657286ac951d0b94e08b0200007870000000647400165649525455414c5f44425f4e414d452069643d313030737200116a6176612e6c616e672e426f6f6c65616ecd207280d59cfaee0200015a000576616c75657870007371007e000a0171007e000b7372002f6f72672e68696265726e6174652e636f6c6c656374696f6e2e696e7465726e616c2e50657273697374656e74426167464a645c192e1ec40200014c0003626167710 07e00047872003e6f72672e68696265726e6174652e636f6c6c656374696f6e2e696e7465726e616c2e416273747261637450657273697374656e74436f6c6c656374696f6e87cca6e4d54cc52d02000949000a63616368656453697a655a000564697274795a000b696e697469616c697a65645a000d737065636a4c617a794c6f61644c00036b65797400164c6a6176612f696f2f53657269616c697a61626c653b4c00056f776e65727400124c6a6176612f6c616e672f4f626a6563743b4c0004726f6c6571007e00024c001273657373696f6e466163746f72795575696471007e00024c000e73746f726564536e617073686f7471007e000f7870ffffffff00000071007e000871007e0005740054636f6d2e6272616e646d616b65722e6d6d732e646f6d61696e2e636f6d6d6f6e2e5669727475616c4461746162617365456e746974794265616e2e7669727475616c4461746162617365546f564442474c697374707070'   (join_table_name:other_entity_key_name INTEGER NOT NULL)“;

由于某种原因而不是实体id,所以使用了它的表示。

1 个答案:

答案 0 :(得分:0)

第一个问题是对第二个问题的暗示。

你需要使用@MapKeyJoinColumn而不是@MapKeyColumn。

http://docs.oracle.com/javaee/6/api/javax/persistence/MapKeyColumn.html

  

指定地图键为a的地图的键列的映射   基本类型

http://docs.oracle.com/javaee/6/api/javax/persistence/MapKeyJoinColumn.html

  

指定到作为地图键的实体的映射。

相关问题