Fall: Ich möchte den Wert des Feldes, das Spalte mit Standardwert auf Datenbankseite zugeordnet ist, nachdem ich Objekt zusammenführen.Hibernate/JPA erhalten Wert der Spalte mit Standardwert in der Datenbank nach der Zusammenführung
Tabelle:
CREATE TABLE IF NOT EXISTS `db`.`OBJECT` (
`OBJECT_ID` INT NOT NULL AUTO_INCREMENT,
`NAME` VARCHAR(64) NULL,
`CREATED_ON` DATETIME NULL DEFAULT CURRENT_TIMESTAMP,
`EDITED_ON` DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
Klasse:
@Entity
@Table(name="OBJECT")
public class SomeObject {
private int id;
private String name;
private Timestamp createdOn;
private Timestamp editedOn;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name = "NAME")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Column(name = "CREATED_ON", insertable = false, updatable = false)
public Timestamp getCreatedOn() {
return createdOn;
}
public void setCreatedOn(Timestamp createdOn) {
this.createdOn = createdOn;
}
@Column(name = "EDITED_ON", insertable = false, updatable = false)
public Timestamp getEditedOn() {
return editedOn;
}
public void setEditedOn(Timestamp editedOn) {
this.editedOn = editedOn;
}
}
DAO:
@Transactional
public class ObjectDAO {
@PersistenceContext
private EntityManager entityManager;
public someObject merge(someObject someObject) {
return entityManager.merge(someObject);
}
}
Was Ich möchte tun:
SomeObject someObject = new SomeObject();
someObject.setName("name");
SomeObject insertedObject = objectDAO.merge(someObject);
System.out.println(insertedObject.getId());
System.out.println(insertedObject.getEditedOn());
Ergebnis: Objekt in die Datenbank eingefügt wird, werden alle Standardwerte richtig generiert.
Frage: Warum zweite println druckt null, aber erste println druckt richtigen Wert der Id, die in die Datenbank eingefügt wurde?
Ich habe meinen Beispielcode geändert, jetzt ist es näher an meinem realen Fall, wo ich '@ Transactional' Annotation verwenden. Trotzdem kann ich keine Werte erhalten, die standardmäßig in der Datenbank sind. – Franek
Ich möchte Ihnen sagen, dass Sie nach der Zusammenführung tatsächlich benötigen, um Ihre Änderung in der Datenbank zu committen, die Sie zu etwas wie diesem benötigen JPA.em(). GetTransaction(). Commit(); und danach werden deine Änderungen in der Datenbank gespeichert, und hier hast du ein Minenprojekt, in dem du jpa mit play implementiert hast https://github.com/mariopetrovic/MediaUploadDataStax, andere Sache, warum ist unsere Methode, wo du die Marge machst, Objekt nicht SomeObject like ist Entitätsname public Object merge (Objekt) { return entityManager.merge (object); –
Dieses Objekt war nur ein Fehler im Beispielcode. Aber ich habe mein Problem endlich gelöst. Die Antwort ist einfach. Es ist nicht möglich, die Spalte mit dem Standarddatenbankwert zu füllen und diesen Wert in der Entität festzulegen, die aus der Zusammenführung zurückgegeben wird. Ich ändere Ansatz und ich generiere Standardwerte auf der Anwendungsseite usgin '@ PrePresist' und' @ PreUpdate' – Franek