2017-07-07 3 views
0
nicht abrufen

Ich arbeite an einer Springboot-Beispielanwendung und verwende Hibernate für JPA. Ich verwende ein generisches Repository-Muster, das alle CRUD-Operationen auf meiner Entität ausführt. Ich folge diesem Beispiel: http://www.concretepage.com/spring-boot/spring-boot-rest-jpa-hibernate-mysql-example, die ich stieß. (Meine Idee, ein generisches Repository zu haben, sollte eine ähnliche Implementierung für alle CRUD - Operationen haben, als explizit eine in jeder Service/DAO - oder Repository - Implementierung für jede Entity anzugeben.) Im obigen Beispiel ist das @ID - Attribut in derselben Klasse wie die Entität. Als Folge davon konnte ich eine Einheit und die ID in das Objekt nach EntityManager.persist (Objekt)Java, Hibernate - ID nach persistierender Entität mit separater eingebetteter Schlüsselklasse

In meinem Code reflektiert würde anhalten ich die Key-Klasse getrennt haben, und es ist in der Entity referenziert Klasse. Beim Aufrufen von EntityManager wird eine Zeile in der Datenbank erstellt (da die Spalte für den Primärschlüssel in der Datenbank automatisch erhöht wird). Diese ID wird jedoch nach dem Aufruf von persist() nicht im Objekt angezeigt. Zu jeder Zeit ist mein ID-Attribut in der Schlüsselklasse auf 0 gesetzt, das ist der Standard-int-Wert. Ich würde gerne wissen, ob es eine Möglichkeit gibt, die ID des eingefügten Objekts entweder über Session oder EntityManager zu holen. Es gibt auch eine andere Strategie, um dieses Problem zu umgehen, ohne den Primärschlüssel in die Entity-Klasse selbst aufzunehmen. (Ab jetzt habe ich an mehreren Stellen sah auf SO hat, aber nicht in der Lage gewesen, zu einer Lösung zu meinem Problem zu erhalten.)

Entity Klasse

@Entity 
@Table(name = "articles") 
public class SampleArticle extends AbstractDomainObject { 
/** The serialVersionUID. */ 
private static final long serialVersionUID = 7072648542528280535L; 
/** Uniquely identifies the article. */ 
@EmbeddedId 
@AttributeOverride(name = "articleId", column = @Column(name = "article_id")) 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
//@GeneratedValue(strategy = GenerationType.AUTO) 
private SampleArticleKey key; 
/** Indicates the title. */ 
@Column(name = "title") 
private String title; 

Key-Klasse

@Embeddable 
public class SampleArticleKey extends AbstractDomainKey { 
/** 
* Serial version id. 
*/ 
private static final long serialVersionUID = 1325990987094850016L; 
/** The article id. */ 
private int articleId; 

Repository Klasse

@Repository 
@Transactional 
public class SampleArticleRepository extends 
AbstractRepository<SampleArticle, SampleArticleKey> implements 
ISampleArticleRepository<SampleArticle, SampleArticleKey> { 
/* 
* (non-Javadoc) 
* @see 
* com.wpi.server.entity.repository.ISampleArticleRepository#addArticle 
* (java.lang.Object) 
*/ 
@Override 
public SampleArticle create(SampleArticle article) throws Exception { 
    return super.create(article); 
} 

Abstrakt Repository

@Transactional 
public abstract class AbstractRepository<T extends AbstractDomainObject, K 
extends AbstractDomainKey> { 
/** The entity manager. */ 
@PersistenceContext 
private EntityManager entityManager; 
/** The Constant LOGGER. */ 
private static final Logger LOGGER = Logger.getLogger(AbstractRepository.class.getName()); 

/** 
* Persist the given object at persistence storage. 
* 
* @param object 
*   The object extending {@link AbstractDomainObject} which needs 
*   to be inserted. 
* @return object of type {@link AbstractDomainObject} with the newly 
*   generated id. 
* @throws Exception 
*    If unable to insert data. 
*/ 
public T create(T object) throws Exception { 
    final Session session = entityManager.unwrap(Session.class); 
    session.getTransaction().begin(); 
    session.save(object); 
    session.flush(); 
    session.getTransaction().commit(); 
    session.close(); 
    LOGGER.fine("Entity CREATED successfully."); 
    return object; 
}; 
+0

Gewöhnlich dort sind sollte 2 Methoden in einem integrierbaren zusammengesetzten Schlüssel überschrieben werden: hashCode(), equals() für die ordnungsgemäße Arbeit. Könnten Sie bitte auch einen Teil eines Codes angeben, in dem Sie Ihren zusammengesetzten Schlüssel festlegen und Ihr Objekt beibehalten. –

+0

Ich habe diese beiden Methoden in meiner Schlüsselklasse und in der Entitätsklasse überschrieben. Der Aufruf wird weiterhin von meiner Serviceklasse aufgerufen, die wiederum das Repository aufruft. 'versuchen { \t \t \t final SampleArticle domainObj = new SampleArticle(); \t \t \t domainObj.setTitle (dto.getTitle()); \t \t \t domainObj.setKategorie (dto.getCategory()); \t \t \t domainObj.setKey (toDomainKey (dto)); \t \t \t article = sampleArticleRepo.create (Artikel); ' Die letzte Zeile hier, ruft die create-Methode in der ** ** SampleArticleRepository Klasse oben gepostet. –

Antwort

0

Lassen Sie mich Ihnen ein funktionierendes integrierbares Schlüsselbeispiel geben. Es könnte helfen. Zuerst überschreiben entspricht() und hashCode() -Methoden, so dass Hibernate Objekte im Geld identifiziert.

enter image description here

Jetzt können Sie Objekte bestehen

enter image description here

Lassen Sie mich wissen, ob das hilft oder Sie haben andere Probleme mit diesem.

Verwandte Themen