Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.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

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 复合主键,外键。对对象或键的引用?_Java_Jpa_Composite Key - Fatal编程技术网

Java 复合主键,外键。对对象或键的引用?

Java 复合主键,外键。对对象或键的引用?,java,jpa,composite-key,Java,Jpa,Composite Key,我有两门课Foo和Bar。数据库中的表如下所示: |Foo| |id : INT (PK) | bar_id : INT (PK, FK) | |Bar| |id : INT (PK) | @Entity public class Bar { @Id @Column(name = "id") private int id; @OneToMany private Set<Foo> foo; } @Entity public class F

我有两门课
Foo
Bar
。数据库中的表如下所示:

|Foo|
|id : INT (PK) | bar_id : INT (PK, FK) |

|Bar|
|id : INT (PK) |
@Entity
public class Bar
{
    @Id
    @Column(name = "id")
    private int id;

    @OneToMany
    private Set<Foo> foo;
}

@Entity
public class Foo
{
    @EmbeddedId
    private FooPK key;

    @MapsId("barId")
    @ManyToOne
    @JoinColumn(name = "bar_id", referencedColumnName = "id")
    private Bar bar;
}

@Embeddable
public class FooPK
{
    @Column(name = "id")
    private int id;
    @Column(name = "bar_id")
    private int barId;
}
通常我会这样映射它:

|Foo|
|id : INT (PK) | bar_id : INT (PK, FK) |

|Bar|
|id : INT (PK) |
@Entity
public class Bar
{
    @Id
    @Column(name = "id")
    private int id;

    @OneToMany
    private Set<Foo> foo;
}

@Entity
public class Foo
{
    @EmbeddedId
    private FooPK key;

    @MapsId("barId")
    @ManyToOne
    @JoinColumn(name = "bar_id", referencedColumnName = "id")
    private Bar bar;
}

@Embeddable
public class FooPK
{
    @Column(name = "id")
    private int id;
    @Column(name = "bar_id")
    private int barId;
}
后一种解决方案的另一个问题是
FooPK
中的
getBarId()
方法需要一个
setbrand(Int)
方法。使用ID设置对象可以通过访问数据访问层来完成,但是(在我看来)这违反了业务/域/数据层的分离

那怎么办呢?使用第一个解决方案并手动保持ID同步,或者是否有其他(最佳)实践?

参考讨论,对Foo和FooPK类进行以下更改:

@Entity
public class Foo {

    @EmbeddedId
    private FooPK key;

    @MapsId("barId") //references EmbeddedId's property
    @JoinColumn(name = "bar_id", referencedColumnName = "id")
    @ManyToOne
    private Bar bar;
}

@Embeddable
public class FooPK {

    @Column(name = "id")
    private int id;
    @Column(name = "bar_id")
    private int barId;
}
我建议首先使用字段访问,然后应用属性访问

那怎么办呢?使用第一个解决方案并保持ID同步 手动还是有其他(最佳)做法


避免痛苦-自动生成ID。

这是第一个示例。我已经看到这是一条“路要走”,我只是想知道第二个例子是否是一条更干净的路。“我想那是一个否定吗?”siebz0r哦,对不起,没有注意到第一个例子是相同的;o。我认为,当存在ID而不是映射对象时,更容易查看PK。如果要按FooPK搜索,则只需要整数,而不需要具有所有不必要属性的对象。