我是rails的新手,今天早上决定抛弃我的整个数据库设计/模型并重新开始.作为一个菜鸟,我肯定做错了.
我删除了所有文件db/migrate/并删除了表格.当我试图生成第一个新的模型类时,rails就挂了.在我赶上^ C然后尝试别的东西之前,在杂草中关闭了10分钟.
这一次,我再次删除了表格,将整个项目移动到project.bad并运行rails new重新开始.再次,在使用旧名称生成新项目之后,它挂起了rails generate命令(我使用相同的项目名称).
无奈之下,我尝试在同一根中创建一个新项目,但使用另一个名称.找到了!这就像一个冠军,创建控制器和模型类,但我完全无法使用原始项目名称,原始项目或任何新创建的项目生成任何内容.为了让这个工作再次起作用,我错过了什么?我不介意在这一点完全失去,但我希望能够再次使用原始项目名称!
这是log/development.log的样子:
(255.5ms) CREATE TABLE `schema_migrations` (`version` varchar(255) NOT NULL) ENGINE=InnoDB
(337.7ms) CREATE UNIQUE INDEX `unique_schema_migrations` ON `schema_migrations` (`version`)
ActiveRecord::SchemaMigration Load (0.2ms) SELECT `schema_migrations`.* FROM `schema_migrations`
(0.2ms) SELECT `schema_migrations`.`version` FROM `schema_migrations`
Run Code Online (Sandbox Code Playgroud)
知道在最后一次SELECT之后应该发生什么吗?
我所拥有的是一组表示消息类型的Java类(接近25个).它们都继承自我想要抽象的Message类.每种消息类型都会向Message超类提供的集合中添加一些其他字段.
我正在使用RESTeasy实现一些RESTful Web服务,并希望有这样的方法:
public Response persist(Message msg) {
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
em.persist(msg);
} catch (Exception e) {
e.printStackTrace();
}
tx.commit();
em.close();
return Response.created(URI.create("/message/" + msg.getId())).build();
}
Run Code Online (Sandbox Code Playgroud)
而不是有25个单独的持久化方法,每个方法都适合特定的消息类型.
目前,我已经注释了我的Message类,如下所示:
@MappedSuperclass
@XmlRootElement(name = "message")
public abstract class Message implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Integer id;
@Embedded
Header header;
@Embedded
SubHeader subHeader;
Run Code Online (Sandbox Code Playgroud)
我的子类看起来像这样:
@Entity
@XmlRootElement(name="regmessage")
@XmlAccessorType(XmlAccessType.FIELD)
public class REGMessage extends Message {
@XmlElement(required = true)
int statusUpdateRate;
@XmlElement(required = true)
int networkRegistrationFlag;
Run Code Online (Sandbox Code Playgroud)
这会创建一个看起来应该工作的模式,但是在持久化操作期间在服务器端看到的所有内容都是Message对象(子类型完全丢失,或者至少它没有被编组回其正确的子类型).在客户端,要调用方法,我这样做:
REGMessage msg …Run Code Online (Sandbox Code Playgroud) 我有一个遗留数据库,我正试图重新设计到21世纪.现有数据结构之一涉及包含二维值矩阵的特定类.如果我要从数据库中对这个类进行逆向工程,我最终会得到一系列属性,例如:
private BigDecimal NODE_1_MATRIX_POS_1_1;
private BigDecimal NODE_1_MATRIX_POS_1_2;
Run Code Online (Sandbox Code Playgroud)
等等.由于这是一个6x6矩阵,因此有很多这样的列.
我一直在寻找更好的方法,但我不确定我在那里.我想做的是这样的事情:
@Entity
public class TestClass {
@Id
private long id;
@CollectionOfElements
@JoinTable(
name="MATRIX_DATA",
joinColumns=@JoinColumn(name="ENTRY_ID"))
private List<List<BigDecimal>> matrix;
Run Code Online (Sandbox Code Playgroud)
但这失败了:
org.hibernate.MappingException: Could not determine type for: java.util.List, at table: MATRIX_DATA, for columns: [org.hibernate.mapping.Column(element)]
Run Code Online (Sandbox Code Playgroud)
而不是仅仅试图修复错误,我想我会四处询问并尝试找到解决此映射挑战的正确方法.有没有人通过JPA找到成功和满意度映射多维数组?
我的模型目前有三个相关的对象(还有更多,但只有三个与此问题相关).用户,网络和电子邮件.我希望能够做的是拥有一组定义的网络,并允许每个用户在每个网络上都有一个电子邮件地址(这些稍微复杂一点,但我已将它们减少到我认为相关的内容) .
class User(UserMixin, db.Model):
"""
The User object.
"""
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
# email = db.Column(db.String(64), unique=True, index=True)
username = db.Column(db.String(64), unique=True, index=True)
password_hash = db.Column(db.String(128))
firstname = db.Column(db.String(64))
lastname = db.Column(db.String(64), unique=False, index=True)
email = db.relationship('Email', backref='user')
class Network(db.Model):
__tablename__ = 'networks'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), index=True)
emails = db.relationship('Email', backref='network', lazy='dynamic')
class Email(db.Model):
__tablename__ = 'emails'
id = db.Column(db.Integer, primary_key=True)
network_id = db.Column(db.Integer, db.ForeignKey('networks.id'))
user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
address = …Run Code Online (Sandbox Code Playgroud) 我正在尝试实现一个接受字符串列表的Web服务,每个字符串都是一个正则表达式.这些需要与数据库的六列进行比较,并且需要返回任何匹配的行.
我相信Oracle有一个我可以使用的regexp_like()函数,但是我正在寻找使用Hibernate 的最佳方法,所以我不反对持久性引擎.
我从这样开始,其中参与者集合包含正则表达式:
List<Message> messages = new ArrayList<Message>();
List<Message> m1 = ((Session) entityManager.getDelegate())
.createCriteria(MessageSSR.class).add(Restrictions.or(
Restrictions.in("Node2Id", participants),
Restrictions.in("Node2Id", participants))).list();
List<Message> m2 = ((Session) entityManager.getDelegate())
.createCriteria(MessageSSR.class).add(Restrictions.or(
Restrictions.in("Node3Id", participants),
Restrictions.in("Node4Id", participants))).list();
List<Message> m3 = ((Session) entityManager.getDelegate())
.createCriteria(MessageSSR.class).add(Restrictions.or(
Restrictions.in("Node5Id", participants),
Restrictions.in("Node6Id", participants))).list();
messages.addAll(m1);
messages.addAll(m2);
messages.addAll(m3);
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为"in"不会做我想要的,这似乎不告诉Hibernate使用正则表达式匹配.
这是我提出的唯一答案,但看起来很难看:
List<Message> messages = new ArrayList<Message>();
for (String re : participants) {
List<Message> m1 = ((Session) entityManager.getDelegate())
.createCriteria(MessageSSR.class)
.add(Restrictions.or(
Restrictions.sqlRestriction("regexp_like(NODE_1, " + re + ")"),
Restrictions.sqlRestriction("regexp_like(NODE_2, " + re + ")")
)).list();
List<Message> m2 = …Run Code Online (Sandbox Code Playgroud)