我在映射以下内容时遇到了一些麻烦:
public class Operation {
private Integer id;
private String name;
private List<Item> items = new ArrayList<Item>();
//set/getters/hashcode/etc. omitted
public void addItem(Item i,Operation end) {
i.setOperationStart(this);
i.setOperationEnd(end};
items.add(i);
end.getItems().add(i);
}
public class Item {
private Integer id;
private String name;
private Operation operationStart;
private Operation operationEnd;
//set/getters/hashcode/etc. omitted
}
Run Code Online (Sandbox Code Playgroud)
所以基本上一个操作有一堆项目,一个项目属于2个操作。此外,如果其中一项操作不存在,则项目存在也没有意义,即如果我删除其中一项操作,我还想从它存储的其他任何地方删除该项目。
有没有人有关于我如何映射上述类的指针,或者可以指出一些示例,显示如何映射具有 2 个父级的子对象?
我正在阅读相当大的行(最多128K)文本fgets.我在服务器上看到过多的上下文切换,使用strace我看到以下内容:
read(3, "9005 10218 00840023102015 201008"..., 4096) = 4096
Run Code Online (Sandbox Code Playgroud)
即一次fgets读取4096字节的块.有什么方法可以控制fgets调用时块的大小read()?
我们正在考虑将SQL查询存储在单独的表中.这些查询仅用于报告目的.针对不同报告的不同查询 - 此外,查询将包含占位符,因此我们可以格式化或使用Winforms前端的预准备语句(它是一个简单的2层报告应用程序),例如格式化要报告的日期范围.
我对此有一些复杂的感觉 - 将SQL存储在表中是否可以,客户端将获取并运行?
我们需要存储最多 2^38 的整数值。有什么理由使用decimal(12,0)还是应该使用bigint?
我正在使用Spring + Hibernate和PostgreSQL的一些"手动"事务管理我想尝试这一点,并在转向基于aop的事务管理之前理解它是如何工作的.
@Repository
public class UserDAOImpl extends HibernateDaoSupport implements UserDAO {
@Override
public void saveUser(User u) {
Transaction tx = getSession().beginTransaction();
getHibernateTemplate().saveOrUpdate(u);
tx.rollback();
}
}
Run Code Online (Sandbox Code Playgroud)
在这里调用saveUser,我假设保存一个新用户将被回滚.但是,移动到psql命令行后,用户将保存在表中.
为什么不回滚,我需要配置什么以这种方式进行交易?
编辑; 多一点调试似乎表明getHibernateTemplate()使用的不同于getSession()返回的会话(?)
将代码更改为
Transaction tx = getSession().beginTransaction();
getSession().persist(u);
tx.rollback();
Run Code Online (Sandbox Code Playgroud)
并且事务确实被回滚.但我仍然不明白为什么hibernateTemplate会使用/创建一个新会话.
我有一把(x,y)钥匙的字典,(x,y)意思相同(y,x),我该怎么做?
我可以:
>>> d = {(1,2): "foo"}
>>> i = d.get(2,1)
>>> if i is None:
... i = d.get((1,2))
...
>>> i
'foo'
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来做到这一点,所以直接d.get((2,1))匹配密钥(1,2)?理想情况下,我想插入例如,(2,1)而不是与(1,2)键不同.
是否有可能在同一个IEnumerable上链接几个LINQ查询?
一些背景,
我有一些文件,大小为20-50Gb,它们不适合内存.有些代码会解析来自这样一个文件的消息,基本上可以:
public IEnumerable<Record> ReadRecordsFromStream(Stream inStream) {
Record msg;
while ((msg = ReadRecord(inStream)) != null) {
yield return msg;
}
}
Run Code Online (Sandbox Code Playgroud)
这允许我对记录执行有趣的查询.例如,找到记录的平均持续时间
var records = ReadRecordsFromStream(stream);
var avg = records.Average(x => x.Duration);
Run Code Online (Sandbox Code Playgroud)
或者也许是每小时/分钟的记录数
var x = from t in records
group t by t.Time.Hour + ":" + t.Time.Minute into g
select new { Period = g.Key, Frequency = g.Count() };
Run Code Online (Sandbox Code Playgroud)
还有十几个我想运行的查询来从这些记录中提取相关信息.一些简单的查询当然可以组合在一个查询中,但这似乎很快就变得难以置信.
现在,每次运行这些查询时,我都必须从头开始读取文件,重新编写所有记录 - 解析20Gb文件20次需要花费时间,这是浪费.
我能做些什么才能只对文件进行一次传递,但对它运行几个linq查询?
所以,经常说它是Java的一个缺点,它没有像C#这样的属性
如果Java获得属性的"本机"支持,那么我们可以获得比getXX/setXX java-bean样式属性更大的优势吗?