给定一个Django模型,我试图列出它的所有字段.我已经看到了一些使用_meta模型属性执行此操作的示例,但是meta前面的下划线是否表示_meta属性是私有属性,不应该直接访问?...例如,因为_meta的布局将来可能会改变而不是一个稳定的API?
_meta是这个规则的例外吗?它是否稳定并且可以使用,或者它被认为是不好的做法?或者是否有函数或其他方法来反省模型的字段而不使用_meta属性?下面是一些链接的列表,显示了如何使用_meta属性执行此操作
任何建议都非常感谢.
本着与CriteriaQuery相关的类型安全的精神,JPA 2.0还有一个API来支持实体的Metamodel表示.
是否有人知道这个API的全功能实现(生成Metamodel而不是手动创建元模型类)?如果有人也知道在Eclipse中设置它的步骤,那将是非常棒的(我假设它就像设置注释处理器一样简单,但你永远不知道).
编辑:偶然发现了Hibernate JPA 2 Metamodel Generator.但问题仍然存在,因为我找不到jar的任何下载链接.
编辑2:少顷已经过去了,因为我问过这个问题,但我想我会回来,并添加一个链接到SourceForge上的Hibernate JPA模型生成项目
我正在尝试使用JPA 2.0来创建具有泛型关系的多态实体.应该有两个表,一个事件表和一个通知表.在这些表中是彼此相关的具体实体,如下所示:
Event <---------- Notification<X extends Event>
| |
LoginEvent <------ LoginNotification extends Notification<LoginEvent>
Run Code Online (Sandbox Code Playgroud)
从逻辑上讲,这应该可以在hibernate中实现,因为它可以在SQL中实现:
+----------+ +----------+
| Event | | Notif |
+----------+ +----------+
| | | Id |
| Id | <- | Evt_id |
| Type | <- | Type |
| ... | | ... |
+----------+ +----------+
Run Code Online (Sandbox Code Playgroud)
这就是我所拥有的:
@Entity
@Inheritance
public abstract class Event{
...
}
@Entity
public class LoginEvent extends Event{
...
}
@Entity
@Inheritance
public abstract class Notification<X extends Event>{
@ManyToOne(optional=false, targetEntity=Event.class)
@JoinColumn …
Run Code Online (Sandbox Code Playgroud) 我第一次使用Criteria API.它是关于抽象通用构建器的查询:
public TypedQuery<T> newQuery( Manager<?,T> manager )
{
CriteriaBuilder builder = this.entityManager.getCriteriaBuilder();
Class<T> genericClass = ( Class<T> ) ( ( ParameterizedType ) manager.getClass().getGenericSuperclass() ).getActualTypeArguments()[1];
CriteriaQuery<T> criteriaQuery = builder.createQuery( genericClass );
Root<T> root = criteriaQuery.from( genericClass );
...
}
Run Code Online (Sandbox Code Playgroud)
该调用默认为实体上找到的所有关系criteriaQuery.from( genericClass );
生成SQL INNER JOIN
.这是一个问题,因为每个关系都为空(DB NULL
或不使用外键且具有无效引用的DB)这些实体将在结果列表中丢失,从而有效地产生错误的搜索结果.
可以在此处找到一个示例:JPA Criteria query Path.get left join is it possibile
对于由此类/方法实例化的查询,我想要发生的是实体上的所有关系,这里genericClass
映射为optional = true
@ManyToOne( FetchType.EAGER, optional = true )
@JoinColumn( name = "CLOSE_USER_ID", referencedColumnName = "USER_ID" )
private …
Run Code Online (Sandbox Code Playgroud) 随着.does
我可以检查一个类型都有,我已经知道了作用.我想获得角色列表.继承有.^mro
但我没有看到类似于元模型中的角色.
除此之外,给定一个"类型",如何判断它是被定义为类还是角色?
在Sun Online资源中,他们提供了关于Criteria/Metamodel API使用的儿子示例,但据我了解Java,似乎无法工作:
CriteriaQuery<Pet> cq = cb.createQuery(Pet.class);
Metamodel m = em.getMetamodel();
EntityType<Pet> Pet_ = m.entity(Pet.class);
EntityType<Owner> Owner_ = m.entity(Owner.class);
Root<Pet> pet = cq.from(Pet.class);
Join<Owner, Address> address = cq.join(**Pet_.owners**).join(**Owner_.addresses**);
Run Code Online (Sandbox Code Playgroud)
Pet_
是一个类的实例, EntityType
它没有定义任何名为owners
或的属性addresses
.
他们确实定义了名为Pet_
和Owner_
元模型的类,但是在这里输入它们会产生与变量名称的冲突......我是对的吗?
__
(这个问题也与此相关的一个)
我有一个持久对象(Action)和自动生成的数据模型(Action_).通过拥有Action类的对象和SingularAttribute的实例,是否可以获得与给定的SingularAttribute相对应的字段?
我需要一个这样的函数:
public S getValue(T object,SingularAttribute<T,S> attribute);
Run Code Online (Sandbox Code Playgroud)
我的实体类(Action.java):
@Entity
@Table(name="ACTION")
public class Action implements Serializable {
private long id;
private String name;
public Action() {
}
@Id
@Column(unique=true, nullable=false, precision=6)
public long getId() {
return this.id;
}
public void setId(long id) {
this.id = id;
}
@Column(length=50)
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
Run Code Online (Sandbox Code Playgroud)
我的元模型类(Action_.java):
@StaticMetamodel(Action.class)
public class Action_ {
public static volatile SingularAttribute<Action, Long> id;
public static volatile SingularAttribute<Action, …
Run Code Online (Sandbox Code Playgroud) 我正在XTend中构建一个代码生成器,我已经有了一个输入模型和元模型.也就是说,我使用ATL为我的XTend代码生成器生成输入模型(作为转换序列的一部分,逐渐降低抽象级别,而不是一次性;这就是我不使用xtext创建语法的原因) .
所以要很清楚,我的代码生成器输入模型是XMI格式的文件,而不是在XTEXT项目的语法(即使不使用)!而且我认为这会给我带来麻烦/困惑.
我使用现有模型创建了一个新的XText项目,右键单击.text文件,运行为,生成人工制品,然后我对mwe2文件执行了相同的操作.
下一步是什么,我做得对吗?如何启动代码生成器?所有示例都来自您使用XText创建DSL的POV.我有一个EMF元模型,以及一个基于XMI的实例.如何使用XTend进一步处理?
任何提示或指向教程的指针都是有帮助的.
解:
该解决方案是为斯文在我接受的答案建议,而且我想指出的是您需要使用的genmodel从你的元模型生成Java工件.此链接显示了如何:http://www.vogella.com/articles/EclipseEMF/article.html,请参阅第4节.这可能看起来太符合逻辑,但我认为无论如何都值得注意.
我目前正在尝试从gradle 4.8.1升级到5.1.1,但是无法为我们的代码生成休眠元模型。
问题是gradle 5忽略了与编译类路径一起传递的注释处理器,但是我发现的所有插件都使用了这个(即"-proc:only"
)。
我试图按照gradle的指示明确指定注释处理器(https://docs.gradle.org/4.6/release-notes.html#convenient-declaration-of-annotation-processor-dependencies)
annotationProcessor 'org.hibernate:hibernate-jpamodelgen'
但这无济于事,我仍然收到以下错误:
警告:注释处理未进行编译,但未找到处理器。
也许插件也需要更新,但是正如我所说,我发现所有插件都将注释处理器与类路径一起传递。我们目前正在使用这个:https : //github.com/Catalysts/cat-gradle-plugins/tree/master/cat-gradle-hibernate-plugin
我正在尝试使用JPA 2.0中的Criteria API创建查询,但我无法使其工作.
问题在于"介于"条件方法.我阅读了一些文档以了解我必须如何做,但是因为我发现了JPA,所以我不明白为什么它不起作用.
首先,当我写"Transaction_"时,我看不到应该出现的"creationDate".
我认为这可能是正常的,因为我读过元模型是在运行时生成的,所以我尝试使用'Foo_.getDeclaredSingularAttribute("value")'而不是'Foo_.value',但它仍然无法正常工作.
这是我的代码:
public List<Transaction> getTransactions(Date startDate, Date endDate) {
EntityManager em = getEntityManager();
try {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Transaction> cq = cb.createQuery(Transaction.class);
Metamodel m = em.getMetamodel();
EntityType<Transaction> Transaction_ = m.entity(Transaction.class);
Root<Transaction> transaction = cq.from(Transaction.class);
// Error here. cannot find symbol. symbol: variable creationDate
cq.where(cb.between(transaction.get(Transaction_.creationDate), startDate, endDate));
// I also tried this:
// cq.where(cb.between(Transaction_.getDeclaredSingularAttribute("creationDate"), startDate, endDate));
List<Transaction> result = em.createQuery(cq).getResultList();
return result;
} finally {
em.close();
}
}
Run Code Online (Sandbox Code Playgroud)
有人能帮我解决这个问题吗?谢谢.
编辑:这里是事务源(几乎没有任何内容,因为它是由Netbeans自动生成的,来自我的数据库)
package projetjava.db;
import …
Run Code Online (Sandbox Code Playgroud)