Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA和新手';关系映射的问题_Java_Jpa - Fatal编程技术网

Java JPA和新手';关系映射的问题

Java JPA和新手';关系映射的问题,java,jpa,Java,Jpa,我正在尝试让以下类型的映射正常工作 Table event has the following columns: id (PK) prodgroup errandtype table errandtype : errandtype table prodgroup: prodgroup 我有相应的JPA课程 @Entity @Table(name="event") public class MyEvent { @Id int id; // what mapping

我正在尝试让以下类型的映射正常工作

Table event has the following columns:
id (PK)
prodgroup
errandtype

table errandtype : errandtype

table prodgroup: prodgroup
我有相应的JPA课程

@Entity
@Table(name="event")
public class MyEvent {
    @Id
    int id;

    // what mapping should go here?
    Prodgroup prodgroup;

    // what mapping should go here?
    ErrandType errandtype;
} 

@Entity
public class Prodgroup {
    @Id
    private String prodgroup;
}

@Entity
public class ErrandType {
    @Id
    private String errandtype;
}
好的,所以问题在代码中被标记为注释,但无论如何我都会尽量明确

在上面的示例中,我希望MyEvent类中的Prodgroup和ErrandType字段设置为相应的Prodgroup和ErrandType实例

我尝试了@OneToOne与@joincolumns和mappedby属性的关系,但我就是无法让它工作,我已经失去了所有逻辑方法的意义。我对JPA实体映射的理解显然很弱


那么,有人能澄清一下吗?

您的表列
event.prodgroup
event.errandtype
是各个表(prodgroup,errandtype)的外键。因此您需要关联(因为许多事件可能共享一个prodgroup或errantype)。

您的表列
event.prodgroup
event.errandtype
是各个表(prodgroup,errandtype)的外键。因此您需要关联(因为许多事件可能共享一个prodgroup或errantype)。

它应该是:

@Entity
@Table(name="event")
public class MyEvent {
    @Id
    int id;

    // what mapping should go here?
    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "prodgroup_id", insertable = true, updatable = true)
    Prodgroup prodgroup;

    // what mapping should go here?
    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "errandtype_id", insertable = true, updatable = true)
    ErrandType errandtype;
} 

@Entity
public class Prodgroup {
    @Id
    private String prodgroup;
}

@Entity
public class ErrandType {
    @Id
    private String errandtype;
}
FetchType Earge表示将始终加载对象(如果未指定,则默认为“惰性”)。
CascadeType.ALL mearge/persist/remove也将对链接表执行

塞巴斯蒂安应该是:

@Entity
@Table(name="event")
public class MyEvent {
    @Id
    int id;

    // what mapping should go here?
    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "prodgroup_id", insertable = true, updatable = true)
    Prodgroup prodgroup;

    // what mapping should go here?
    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "errandtype_id", insertable = true, updatable = true)
    ErrandType errandtype;
} 

@Entity
public class Prodgroup {
    @Id
    private String prodgroup;
}

@Entity
public class ErrandType {
    @Id
    private String errandtype;
}
FetchType Earge表示将始终加载对象(如果未指定,则默认为“惰性”)。
CascadeType.ALL mearge/persist/remove也将对链接表执行



Sebastian

您是否使用JPA类生成表格?或者您正在尝试映射到现有表?@user1697575我正在尝试映射到现有表您是否使用JPA类生成表?或者您正在尝试映射到现有表?@user1697575我正在尝试映射到现有表我也会这样做。但在这种情况下,我看不出有任何理由使用FetchType\u。事实上,您应该避免使用它,除非由于性能问题而完全需要它。fetch In@manytone注释的默认值是EAGER。所以显式FetchType.EAGER没有效果(当然,如果API不太熟悉的话,它会是一个有用的提醒)。这个答案在概念上是正确的,基本上解决了我的问题。为了让它一直工作,我必须代理差事类型和prodgroup键。然后,PKs变为整数兼容,根据我收到的错误消息,这是必需的。如何使用单字符串类型PKs?对于多列PKs,有一个概念@Embeddeble,但我必须也为单列但非整数PKs使用这样的类吗?是的,我认为您需要使用@Embeddeble,例如,请参阅此线程:但请在该特定主题上打开一个新线程,我想您可能会得到一个更优雅的答案。我也会这样做。但在这种情况下,我看不出有任何理由使用FetchType\u。事实上,您应该避免使用它,除非由于性能问题而完全需要它。fetch In@manytone注释的默认值是EAGER。所以显式FetchType.EAGER没有效果(当然,如果API不太熟悉的话,它会是一个有用的提醒)。这个答案在概念上是正确的,基本上解决了我的问题。为了让它一直工作,我必须代理差事类型和prodgroup键。然后,PKs变为整数兼容,根据我收到的错误消息,这是必需的。如何使用单字符串类型PKs?对于多列PKs,有一个概念@Embeddeble,但我必须也为单列但非整数PKs使用这样的类吗?是的,我认为您将需要使用@Embeddeble,例如,请参阅此线程:但请在该特定主题上打开一个新线程,我想您可能会收到一个更优雅的答案。感谢您的澄清。我看到的这个关系的问题是,在Java视图中,它实际上是一对一的映射,因为它没有父子关系(即两边都没有集合)。但是JPA注释显然应该与数据模型概念相关。@Rythmic如果它是一对一的关联,那么也可以使用
@OneToOne
。我不知道您的系统,但您确定这确实是一个一对一的关联(即,一个特定的prodgroup或差事类型最多只能由一个事件使用?)。不,这显然是一个多对一关联,因为某个差事类型和prodgroup可以存在于事件表的多行中。问题是,所有显示多个关系的示例都有一个父-子透视图,父-子透视图中的父对象有一组子对象。在我的例子中,每个事件正好有一个差事类型和一个prodgroup,因此在两个实体类中都没有集合。无论如何,它是以上面的解决方案为指导解决的。因此,解决方案显然有很多,这为你赢得了投票权:)谢谢你的时间。谢谢你的澄清。我看到的这个关系的问题是,在Java视图中,它实际上是一对一的映射,因为它没有父子关系(即两边都没有集合)。但是JPA注释显然应该与数据模型概念相关。@Rythmic如果它是一对一的关联,那么也可以使用
@OneToOne
。我不知道您的系统,但您确定这确实是一个一对一的关联(即,一个特定的prodgroup或差事类型最多只能由一个事件使用?)。不,这显然是一个多对一关联,因为某个差事类型和prodgroup可以存在于事件表的多行中。问题是,所有显示多个关系的示例都有一个父-子透视图,父-子透视图中的父对象有一组子对象。在我的例子中,每个事件正好有一个差事类型和一个prodgroup,因此在两个实体类中都没有集合。无论如何,它是以上面的解决方案为指导解决的。一般