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 字符串作为用户插入的实体ID[EclipseLink] [简介] 数据库:ApacheDerby 日食_Java_Jpa_Eclipselink_Derby - Fatal编程技术网

Java 字符串作为用户插入的实体ID[EclipseLink] [简介] 数据库:ApacheDerby 日食

Java 字符串作为用户插入的实体ID[EclipseLink] [简介] 数据库:ApacheDerby 日食,java,jpa,eclipselink,derby,Java,Jpa,Eclipselink,Derby,嘿,我一直在寻找答案,但找不到答案,所以就这样吧。我正在编写简单的数独应用程序,我想添加的下一个功能是将我的数独板保存在数据库中,并在需要时检索它们。下面是我的两个主要类的UML图: 我的两个实体的结构如下: SudokuBoard实体: @Entity public class SudokuBoard implements Serializable, Cloneable { @Id @GeneratedValue(strategy = GenerationType.AUTO) private

嘿,我一直在寻找答案,但找不到答案,所以就这样吧。我正在编写简单的数独应用程序,我想添加的下一个功能是将我的数独板保存在数据库中,并在需要时检索它们。下面是我的两个主要类的UML图: 我的两个实体的结构如下:

SudokuBoard实体:

@Entity
public class SudokuBoard implements Serializable, Cloneable {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

private static final long serialVersionUID = 1L;

@OneToMany(cascade=CascadeType.PERSIST)
private ArrayList<SudokuField> board;

public ArrayList<SudokuField> board() {
    return board;
}

public void setBoard(ArrayList<SudokuField> board) {
    this.board= board;
}

public Long etId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
} 
[问题]

我想知道是否有可能不使用自动生成的键,而是在SudokuBoard实体中使用字符串作为PK。在我的应用程序中,我实现了绑定,所以我想保存SudokuBoard的同一个对象,它在不同的名称下随时间而变化。 希望我把我的意图说清楚。感谢您提供的帮助和技巧。

使用字符串作为主键非常简单-只需声明它并删除@GeneratedValue注释即可

但是,如果“保存同一对象”是指更改主键。。。不可能使用不同的名称。如果您尝试在不同的主键下持久化/合并现有实体,JPA将引发异常或将其视为新实体,从而导致数据库中出现重复条目。简单地说,将id分配给实体是永久的


总之,我建议您保留一个自动生成的代理键,并为名称声明另一个唯一的字符串字段。使用技术领域传达业务信息很少是个好主意

通过“保存同一对象…”。。。在不同的名称下,我的意思是我希望同一个对象有多个条目,这些条目的状态随着时间的推移而不同。现在,当我实例化该对象时,我不能多次将其持久化,因为它的PK只分配了一次,并且每当我尝试这样做时,都会引发重复密钥异常。我想实现的概念是:1创建随机数独字段2将其保存到数据库3填充同一块板上缺少的一些字段4能够在不同的IDOK下再次保存,现在我得到了它。不幸的是,除了手动创建和保存SudokuBoard和SudokuFields的副本之外,我认为没有一种简单的方法可以实现您想要的功能。你不觉得你的数据模型有点过于复杂了吗?SudokuFields真的需要自己的持久身份吗?我建议使用整数列表。如果您确实需要一个单独的SudokuField模型,我仍然会将@OneToMany映射替换为@Embeddedables的@ElementCollection。这样,您就可以分离Sudokuboard,更新主键,并将其作为一个新实体持久化,而不是手动复制整个结构。不再需要为SudokuFields列表提供新的副本。这样,我将能够在数据库中存储多个板,或者仅存储最实际的板?我们将努力实现这一目标。感谢您的支持和简短解释。通常,您可以合并一个分离的实体,同时保留原始id,以“显示”实体管理器您现在希望它具有的状态。但是,当您更改id并保留分离的实体时,它将被视为全新的实体。此操作不会以任何方式影响原始实体,因此最终将使用两个实体而不是一个实体。
@Entity
public class SudokuField implements Serializable, Comparable<SudokuField>, 
Cloneable {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@Transient
private static final Logger logger = 
LoggerFactory.getLogger(SudokuField.class);
@Transient
private static final long serialVersionUID = 1L;

@Basic(fetch = FetchType.EAGER)
@Column(name = "Value")
private int value;

@ManyToOne
@JoinColumn(name = "board_fk", referencedColumnName = "id")
private SudokuBoard sudokuBoard;
@Override
public void write(SudokuBoard obj, String path) throws 
FileNotFoundException, IOException {
    entityManager.getTransaction().begin();
    entityManager.persist(obj);
    entityManager.getTransaction().commit();
}