2015-01-27 1 views
0

다음 엔티티 구조가 있습니다.엔티티 관리자가 지속되면 불필요한 업데이트가 발생합니다.

@Entity 
@Table(name = "vertex") 
@Inheritance(strategy = InheritanceType.JOINED) 
public class Vertex implements Serializable { 
    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
@JoinTable(name = "vertex_edge", joinColumns = { 
    @JoinColumn(name = "vertex_id", referencedColumnName = "vertex_id") 
}, inverseJoinColumns = { 
    @JoinColumn(name = "edge_id", referencedColumnName = "edge_id") 
}) 
/** list of neighbor resources. */ 
private Collection<Edge> edges= new HashSet<Edge>(); 

public void setVertex(Vertex neighbourVertex) 
{ Edge edge = new Edge(this, neighbourVertex); 
    edges.add(edge); 
    } 


@Entity 
@Table(name = "edge") 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = "edgeType", discriminatorType = DiscriminatorType.STRING) 
public abstract class Edge implements Serializable { 
/** 
* 
*/ 
private static final long serialVersionUID = 8827162781366388321L; 
@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "edge_id", nullable = false) 
private long edgeID; 
@OneToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "start_vertex_id") 
private Vertex start; 
@OneToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "end_vertex_id") 
private Vertex end; 
} 

엔티티를 저장하는 방법 섹션입니다.

EntityManager em = EMFactory.getEM(); 
     em.getTransaction().begin(); 
     Vertex vertex1= new Vertex(); 
     vertex1.setVertex(new Vertex()); 
     em.persist(vertex1); 
     em.flush(); 
     em.getTransaction().commit(); 
     em.close(); 

출력됩니다. 업데이트 진술을 이해할 수 없습니다. 거대한 개체 목록을 유지할 때 이것은 성능 문제입니다. 당신이 당신의 edge 객체를 저장할 때

Hibernate: insert into vertex 
Hibernate: insert into edge (end_vertex_id, start_vertex_id, edgeType) values (?, ?, 'edgeType1') 
Hibernate: insert into vertex 
**Hibernate: update edge set end_vertex_id=?, start_vertex_id=? where edge_id=?** 
Hibernate: insert into vertex_edge(vertex_id, edge_id) values (?, ?) 

는 JPA 구성 난 당신의 코드에 맞춰

<persistence-unit name="DBService" 
    transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <properties> 
     <property name="javax.persistence.jdbc.user" value="user" /> 
     <property name="javax.persistence.jdbc.password" value="password" /> 
     <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> 
     <property name="javax.persistence.jdbc.url" value="url of database" /> 

     <property name="hibernate.hbm2ddl.auto" value="update" /> 
     <property name="hibernate.show_sql" value="true" /> 
     <property name="hibernate.jdbc.batch_size" value="100" /> 
      value="false" /> 
    </properties> 

</persistence-unit> 
+0

jpa 구성을 추가 할 수 있습니까? –

+0

추가 된 Jpa 구성 – user725455

답변

0

당신은 할 YouredgeEntity.setSomeProperty(..) 이 저장하거나이 엔티티 숙박에 후 개체를 얻을 때 어떻게 최대 절전 모드 일이다 세션 또는 우리는 세션에 연결되어 있다고 말하면 setting 최대 절전 모드 updating을 만듭니다. 당신이 더 많은 도움을 객체를 저장할 때

+0

저장 부분이 추가되었습니다. 엔티티를 저장 한 후 새 속성을 설정하지 않습니다. – user725455

0

당신의 매핑이 당신이 가지고 있기 때문에 이상하다 코드를보기 :

  • 다수 - 대에 정점 참조
  • 정점과 에지 에지 많은 협회, 따라서 추가 vertex_edge 링크 테이블

나는 당신이 가장자리를 변경할 필요가 있다고 생각 :

@OneToMany(mappedBy="start") 
private Set<Edges> startEdges = new HashSet<Edge>(); 

@OneToMany(mappedBy="end") 
private Set<Edges> endEdges = new HashSet<Edge>(); 

그냥 당신이 협회의 양쪽을 동기화해야합니다 :
@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "start_vertex_id") 
private Vertex start; 

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "end_vertex_id") 
private Vertex end; 

그리고 정점에.

+0

Vertex 클래스에서 setVertex 함수를 추가했습니다. 항목 1과 항목 2를 구현합니다. – user725455

+0

업데이트 된 답변을 확인하여 매핑을 재구성해야하는 방법을 이해합니다. –

+0

addEdge 함수가 잘못되었습니다. 모서리 컬렉션에 정점을 추가하고 있습니다. – user725455

관련 문제