1.1.24. fejezet, ORM

Hibernate trükkök

SQLite adatforrás

    <datasource jndi-name="java:jboss/datasources/Homework4SQLiteDS"
        pool-name="Homework4SQLite" enabled="true"
        use-java-context="true">
        <connection-url>jdbc:sqlite:${jboss.home.dir}/welcome-content/config.db</connection-url>
        <driver>sqlite</driver>
    </datasource>

Proxy mezők lecserélése objektum példányra

@ViewScoped
class ViewScopedBean {
...
    @Inject
    private StatelessBean service;
---
    @Resource
    private UserTransacrion ut;
...
    public void fetch() {
      try{
         ut.begin;
...
         entity = service.find(1L);
...
         deproxyEntity(entity);
...
      } finally {
         ut.rollback;
      }
...
    }
...
    public static void deproxyhEntity(Object object) {
        Field[] fields = object.getClass().getDeclaredFields();
        for (Field field : fields) {
            try {
                field.setAccessible(true);
                Object fieldValue = field.get(object);
                if (fieldValue instanceof HibernateProxy) {
                    Object detachedFieldValue = ((HibernateProxy) fieldValue).getHibernateLazyInitializer().getImplementation();
                    field.set(object, detachedFieldValue);
                }
            } catch (IllegalArgumentException | IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }
...
}
 
@Stateless
class StatelessBean {
...
  @Inject
  private EntityManager em;
...
  public A find(Long id) {
    A entity = em.find(A.class, id);
  }
....
}

(@Stateless objektum metódushívása legyen a felhasználói tranzakción belül!)

Egyéb tranzakciókkal kapcsolatos feladat a
batch insert/update

Annotációk az entitások kapcsolódáshoz

 
//Sokból az egy kapcsolat:
@Entity
public class Phone {
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private Long id;
 
	@ManyToOne
	@JoinColumn(name = "owner_Id")
	private Employee owner;
}
 
//Egy a sokhoz kapcsolat
@Entity
public class Employee {
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private Long id;
 
	@OneToMany(mappedBy="Phone")
	@JoinTable //ha kapcsolótáblával szeretnénk megoldani, nem kell a mappedBy
	  (
	      name="EMP_PHONE",
	      joinColumns={ @JoinColumn(name="EMP_ID", referencedColumnName="EMP_ID") },
	      inverseJoinColumns={ @JoinColumn(name="PHONE_ID", referencedColumnName="ID", unique=true) }
	  )
	private Set<Phone> phones;
}
 
@Entity
public class Employee {
	@Id
	@Column(name="ID")
	private long id;
 ...
	@ManyToMany
	@JoinTable(
	   name="EMP_PROJ",
	   joinColumns=@JoinColumn(name="EMP_ID", referencedColumnName="ID"),
	   inverseJoinColumns=@JoinColumn(name="PROJ_ID", referencedColumnName="ID"))
	private List<Project> projects;
 ...
}

Kapcsolódó hivatkozások