2014-09-02 27 views
3

我有三个表结构简单:JPA /休眠:该地图很多一对多关系连接表的时候有自己的主键

pub [id, name] 
days [id, name] 
pub_days [id, pub_id, days_id] 

出于某种邪恶的原因,有人认为,复合身份pub_days表(这将是pub_id + days_id)是不够的,并添加了自己的主键。现在我无法改变它,其他更大的系统依赖于此。 #sigh

我试图映射此标准@ManyToMany JPA注释像这样对Hibernate(我省略的getter,setter方法,@Entitiy注释和其它杂波):

class Pub { 

    @ManyToMany(cascade = {CascadeType.ALL}) 
    @JoinTable(name = "pub_days", 
      joinColumns = {@JoinColumn(name = "pub_id")}, 
      inverseJoinColumns = {@JoinColumn(name = "days_id")}) 
    @OrderBy("id") 
    private List<Day> pubOpeningDays; 
} 

class Day { 
    @Id Long id; 
    String name. 
} 

当我执行下面的代码:

Day day = repository.find(Day.class, id); 
pub.getPubOpeningDays().add(day); 
repository.persist(pub); 

我得到这个错误:

ERROR: ORA-01400: cannot insert NULL into ("PUB"."pub_days"."id") 

可悲的是,麦这完全有意义,因为我没有在任何地方映射该ID。事情是,我甚至不想。我希望它生成,但不知道如何解决这个问题与@ManyToMany映射。有任何想法吗?

+0

我想创建具有这两个类属性的POJO类的且具有可以使用任何现有的JPA策略生成它自己的PK。 – 2014-09-02 12:56:50

+0

我需要改变我的映射吗? – Xorty 2014-09-02 12:59:51

+0

在这两个类@ManyToMany将在那里,但与这个新的实体。更多我看到“CascaseType.ALL”应该避免。 – 2014-09-02 13:01:48

回答

0

,你能做些什么,就像我在我的评论中提到,你可以创建这将反过来有两个类A和B连接一个独立的实体CD,现在的关系是许多A和B之间有许多,因此A(多对多)CD(多对多)B.现在根据您的需求,无论何时您需要获取A或B的实例,您可以做的只是在数据库中使用适当的参数(例如,id或id)触发查询的b这将帮助你得到你需要的结果。

0

我只看到两个选择,或者将您的映射更改为PubDay列表,如samwise-gamgee在注释中告诉您的,或者您在表pub_days上插入触发器时添加触发器,该列表为列ID设置值(如果它是空(它可能是使用序列)。但是这种方法取决于数据库支持的功能。

+0

好吧,可悲的是,这是要走的路。我不得不映射连接的实体: - /对于那些有兴趣在更多的细节,我给自己买了本书的Java持久性与Hibernate“并没有用完全相同的问题的段落 - 在我的版本是7.2.3添加列连接表。 – Xorty 2014-09-02 14:59:47